package com.xxxx.spring.day08;

import java.lang.reflect.Proxy;

public class JdkProxyDemo {

    interface Foo{
        void foo();
    }

    static class Target implements Foo{
        @Override
        public void foo() {
            System.out.println("target foo");
        }
    }

    public static void main(String[] args) {
        // 目标对象
        Target target = new Target();
        ClassLoader loader = JdkProxyDemo.class.getClassLoader(); // 用来加载在运行期间动态生成的字节码
        /**
         * Proxy.newProxyInstance方法需要三个参数：
         *       ClassLoader：用于加载动态生成的代理类
         *       接口数组：代理类需要实现的接口
         *       InvocationHandler：调用处理器，定义了代理方法的执行逻辑
         *              InvocationHandler是动态代理的核心，它只有一个方法：
         *              public Object invoke(Object proxy, Method method, Object[] args)
         *              proxy：代理对象本身（注意不要在这个方法内调用proxy的方法，否则会导致无限递归）
         *              method：当前被调用的方法
         *              args：方法参数
         */
        Foo proxy = (Foo) Proxy.newProxyInstance(loader, new Class[]{Foo.class}, (proxy1, method, args1) -> {
            System.out.println("before");
            // 目标.方法(参数)
            // 方法.invoke(目标,参数);
            Object result = method.invoke(target, args1);
            return result; //让代理也返回目标方法执行的结果
        });
        proxy.foo();
    }
}
